16.1 Sensor 0159 (MG811) + Exemple amb dades
El sensor 0159 disposa d'una electroquímica al seu interior que és sensible a la variació del CO2.
L'electróde del sensor de CO2 té la següent estructura.
Té una capa d'electròlit sòlid (1) , elèctrodes d'or (2) , fils de platí (3), Escalfador (4), tubs de porcellana (5),100m d'una doble capa d'acer inoxidable (6), anell platejat de coure i niquel (7), baquelita aïllant (8), pin (pota) de coure i niquel (9).
Aquest sensor és una cel·la electroquímica sòlida composada de les següents cel·les:
Aire , Au|NASICON || carbonat|Au , aire, CO2
El NASICON (Na3Zr2Si2PO12) és conductor super iònic sòlid ceràmic.
Quan el sensor s'exposa al CO2, les següents reaccions ocorren:
Reacció catòdica:
Reacció anòdica:
La reacció química resultant és:
La força electromotriu (FEM) resultant de la reacció de l' elèctrode d'acord amb l'equació de Nerst és:
on P(CO2)és la pressió parcial del CO2 mesurada en Pascals.
on Eo és el potencial de reducció estàndard tabulat en taules químiques..
on R val 8,3144 J/K i és la constant dels gasos.
on T és la Temperatura absoluta en ºK
on F val 96486 Coulombs/mol és la Constant de Faraday.
on FEM és la força electromotriu mesura en mV una vegada amplificada amb un amplificador operacional.
La tensió del sensor cal que siga 6V per escalfar la resistència suficient i llavors es comporta con una cel·la d'acord amb la llei de Nerst, això és veu en la figura següent.
El valor de la FEM es compara amb la lectura d'un espectrofotòmetre d'infraroig que mesura la concentració de CO2 en ppm. Calibrant el sensor mitjançant la lectura de dos concentracions i el seu estudi logarítmic ens permet agafar les mesures de CO2.
2. Esquema elèctric.
Anem a veure l'esquema elèctric que connectarem a la targeta Arduino.
El programa per mesurar els V i provar el sensor degudament calibrat és aquest:
// TiH-File_DFRobot.ino Programa per enregistrar Temperatura en ºC ,Humitat en % , CO2 en ppm i la data en format (day,month,yr,hr,min,sec) a una tergeta SD o microSDHC
// Per fer aquest programa s'han gastat les fonts 1 , 2 i 3 que segueixen
// Font1: http://playground.arduino.cc/Main/DHTLib
// Font2: https://www.arduino.cc/en/Tutorial/Files
// Font3 = https://www.dfrobot.com/wiki/index.php/CO2_Sensor_SKU:SEN0159
// created Nov 2010 by David A. Mellis
// modified 9 Apr 2012 by Tom Igoe
// Created Tiequan Shao: tiequan.shao@sandboxelectronics.com
// Created Peng Wei: peng.wei@sandboxelectronics.com
// Modified by Leff from DFRobot, leff.wei@dfrobot.com, 2016-4-21, make the algorithm clearer to user
// Modificat per Carles Ferrando el 18 de març de 2017
// Llicència: GNU GPL v3: https://www.gnu.org/licenses/gpl.html
#include <SD.h>
File myFile;
#include <dht.h>
dht DHT;
#define DHT22_PIN 7 // Port sensor temperatura i humitat
#include <Time.h>
//Definim temperatura i humitat relativa reals mesurades pel sensor DHT11 de DFRobot
float temperatura; // T en ºC
float humitat; // Humitat relativa %
//Definim la data i hora per configurar el rellotge
int hora;
int minut;
int segon;
int dia;
int mes;
int any;
/************************Constants del programa*********|***************************/
int MG_PIN = 0 ; //Defineix el port analogic per mesurar la lectura de voltatge (CO2)
int DC_GAIN = 8.5 ; // Defineix el guany del amplificador operacional
int READ_SAMPLE_TIMES = 5 ; //Defineix el nombre de mostres que es prendran en funcionament normal
int READ_SAMPLE_INTERVAL = 50 ; //defineix l'interval de temps (en milisegons) entre cada mostra
/**********************Valors que cal calibrar**********************************/
//Aquests valors difereixen de sensor a sensor. L'usuari ha de determinar aquest valor.
float ZERO_POINT_X = 2.894976231; // log785.1926605505 = 2.894976231, el punt inicial a l'eix X de la corba
float ZERO_POINT_VOLTAGE = 0.2370642202; //defineix la eixida del sensor en Volts quan la concentració de CO2 es 785,1926605505 PPM
float MAX_POINT_VOLTAGE = 0.0525 ; //defineix la eixida del sensor en volts quan la concentració de CO2 és 9731,75 PPM
float MAX_POINT_X = 3.9881909438 ; //log(9731.75)=3.9881909438 el punt final de la corba logaritmica
float lecturaSensorCO2;// lecturaSensorCO2 =volts/DC_GAIN el voltatge esta amplificat DC_GAIN i ens cal el voltatge sense amplificar per fer calculs
float LConcentracioCO2; // log(CO2 en ppm)
float ConcentracioCO2 ; // CO2 en ppm
float volts; //lectura amplificada del voltatge
void setup()
{
// Obre el port serie de comunicacions i espera per connectar al port
Serial.begin(9600);
while (!Serial) {
; // espera per connectar al port. Necessari sols per Leonardo
}
//setTime(hr,min,sec,day,month,yr); // CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE A LA RATLLA DE SOTA
setTime(11,07 ,00,6,2,2017); // CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE
Serial.println("IES Gabriel Ciscar Aula Tecnologia 3");
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(10)) {
Serial.println("Initcializacio feta!");
return;
}
Serial.println("initcializacio feta.");
if (SD.exists("dades.txt")) {
Serial.println("dades.txt existeix.");
}
else {
Serial.println("dades.txt no existeix.");
}
// Obre un fitxer nou i tanca'l de forma immediata:
Serial.println("Creant dades.txt...");
myFile = SD.open("dades.txt", FILE_WRITE);
myFile.close();
// Comprova si el fitxer existeix:
if (SD.exists("dades.txt")) {
Serial.println("dades.txt existeix.");
}
else {
Serial.println("dades.txt no existeix.");
}
}
void loop()
{
// Actualitza l_hora a partir de l_hora configurada al setTime
time_t t = now();
hora = hour(t);
minut= minute(t);
segon= second(t);
dia = day(t);
mes= month(t);
any= year(t);
File dataFile = SD.open("dades.txt", FILE_WRITE);
// Llegeix les dades
int chk = DHT.read22(DHT22_PIN);
volts = MGRead(MG_PIN);
lecturaSensorCO2 =volts/DC_GAIN ;
LConcentracioCO2 = (ZERO_POINT_X+((MAX_POINT_X-ZERO_POINT_X)/(MAX_POINT_VOLTAGE -ZERO_POINT_VOLTAGE))*(lecturaSensorCO2-ZERO_POINT_VOLTAGE));
ConcentracioCO2 = pow(10, LConcentracioCO2);
Serial.println("Volts llegits= ");
Serial.println(volts);
Serial.println("Volts corregits= ");
Serial.println(lecturaSensorCO2);
// Mostra les dades pel terminal serie
humitat=DHT.humidity ;
temperatura= DHT.temperature;
Serial.print(dia);
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(any);
Serial.print(" ");
Serial.print(hora);
Serial.print(":");
Serial.print(minut);
Serial.print(":");
Serial.print(segon);
Serial.print(" ");
Serial.print(";");
Serial.print(" ");
Serial.print(humitat);
Serial.print(" ");
Serial.print(";");
Serial.print(" ");
Serial.print(temperatura);
Serial.print(" ");
Serial.print(";");
Serial.print(" ");
Serial.println(ConcentracioCO2 );
//Guarda les dades a la targeta SD
if (dataFile) {
dataFile.print(dia);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(mes);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(any);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(hora);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(minut);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(segon);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(humitat);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.print(temperatura);
dataFile.print(" ");
dataFile.print(";");
dataFile.print(" ");
dataFile.println(ConcentracioCO2);
dataFile.close();
}
else {
Serial.println("Error en obrir el fitxer");
// if the file didn't open, do something here
}
delay (60000); // Espera 60 segons entre cada mesura
}
/***************************** MGRead *********************************************
Input: mg_pin - analog channel
Output: output of SEN-000007
Remarks: This function reads the output of SEN-000007
************************************************************************************/
float MGRead(int mg_pin) {
int i;
float v = 0;
for (i = 0; i < READ_SAMPLE_TIMES; i++) {
v += analogRead(mg_pin);
delay(READ_SAMPLE_INTERVAL);
}
v = (v / READ_SAMPLE_TIMES) * 5 / 1024 ;
return v;
}
El programa el tens també ací en un zip: TiHCO2_File.zip (zip - 2788 B)
Exemple amb dades reals:
Hem tancat una kalamchoe en un recipient tancat amb sensors de temperatura , humitat i CO2 durant tres dies i hem mesurat les dades de l'atmosfera per monitoritzar la respiració i la fotosíntesi amb el programa anterior.
Ací tens un diagrama amb la temperatura en º Centigrads durant els 2 dies que va durar l'experiment.
Ací tens un diagrama amb la humitat relativa en % durant els 2 dies que va durar l'experiment.
Ací tens un diagrama amb la concentració de CO2 en ppm durant els 2 dies que va durar l'experiment.
Ací tens un diagrama amb la concentració de O2 (calculada) en ppm durant els 2 dies que va durar l'experiment.
1) Cerca informació sobre la fotosíntesis CAM i es plantes crassulàcies.
2) Sabries dir si els estomes de la kalamchoe estan tancats completament durant tot el dia ? Respon argumentant amb dades d'alguna gràfica.
3) Sabries explicar que fa la kalamchoe durant la nit ? Respon argumentant amb dades d'alguna gràfica.
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial CompartirIgual 3.0